﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.IO;

namespace BitPortal.Utils
{
    public static class FileUtils
    {
        public static string GetVirtualPath(string physicalPath)
        {
            if (File.Exists(physicalPath) || Directory.Exists(physicalPath))
            {
                return "/" + physicalPath.Replace(HttpContext.Current.Request.PhysicalApplicationPath, "").Replace("\\", "/");
            }
            return null;
        }

        /// <summary>
        /// Upload file len server
        /// </summary>
        /// <param name="postedFile"></param>
        /// <param name="targetFolder"></param>
        /// <param name="allowType"></param>
        /// <param name="maxSize"></param>
        /// <param name="overrideExistFile"></param>
        /// <returns></returns>
        public static string UploadFile(this HttpPostedFile postedFile, string targetFolder = "~/Upload", string allowType = "All",
            int maxSize = Int32.MaxValue, bool overrideExistFile = false)
        {
            if (postedFile == null) { throw new Exception("Bạn chưa chọn file!"); }
            //Check size
            if (postedFile.ContentLength >= maxSize)
            {
                throw new Exception("File upload không được vượt quá " + maxSize + " bytes!");
            }
            //Check Type
            // "application"  / "audio"  / "image"  / "message"  / "multipart"  / "text"  / "video"        
            switch (allowType)
            {
                case "Image":
                    if (!postedFile.ContentType.ToLower().Contains("image"))
                    {
                        throw new Exception("Không đúng định dạng ảnh!");
                    }
                    break;
                case "Video":
                    if (!postedFile.ContentType.ToLower().Contains("video"))
                    {
                        throw new Exception("Không đúng định dạng video!");
                    }
                    break;
                case "Audio":
                    if (!postedFile.ContentType.ToLower().Contains("audio"))
                    {
                        throw new Exception("Không đúng định dạng audio!");
                    }
                    break;
                case "Flash":
                    if (!postedFile.ContentType.ToLower().Contains("application/x-shockwave-flash"))
                    {
                        throw new Exception("Không đúng định dạng flash!");
                    }
                    break;
                case "Document":
                    if (!(postedFile.FileName.EndsWith(".doc") || postedFile.FileName.EndsWith(".docx") || postedFile.FileName.EndsWith(".pdf")))
                    {
                        throw new Exception("Không đúng định dạng tài liệu văn bản (.doc,.docx,.pdf)!");
                    }
                    break;
            }
            string filePath =  postedFile.FileName.Substring(postedFile.FileName.LastIndexOf('\\')+1);
            string filename = targetFolder + "/" + filePath;
            string name = postedFile.FileName.Substring(postedFile.FileName.LastIndexOf('\\') + 1,filePath.Substring(0,filePath.LastIndexOf('.')).Length);
            string extention = postedFile.FileName.Substring(postedFile.FileName.LastIndexOf('.'));
            //Check Exist file
            if (!overrideExistFile)
            {
                int count = 0;
                while (File.Exists(HttpContext.Current.Server.MapPath(filename)))
                {
                    count++;
                    filename = targetFolder + "/" + name + "(" + count + ")" + extention;
                }
            }
            //Upload the file
            postedFile.SaveAs(HttpContext.Current.Server.MapPath(filename));
            //Return absoluted path
            return filename.Substring(1);
        }
    }
}
